package com.zhj.test.netty.codec2;

import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.CharsetUtil;

/**
 * 必须继承规定的适配器
 * @author zhj
 */
public class NettyServerHandler extends ChannelInboundHandlerAdapter {

    /**
     * 读取数据
     * @param ctx 上下文对象，含有管道pipeline,通道channel,地址
     * @param msg 客户端发送的数据 默认是Object
     * @throws Exception
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        System.out.println("服务器读取线程 " + Thread.currentThread().getName());
        DataInfo.MyMessage data = (DataInfo.MyMessage) msg;
        DataInfo.MyMessage.DataType type = ((DataInfo.MyMessage) msg).getDataType();
        if (DataInfo.MyMessage.DataType.StudentType == type) {
            System.out.println("【客户端】发送的数据 id:" + data.getStudent().getId() + " 名字：" + data.getStudent().getName());
        } else if (DataInfo.MyMessage.DataType.workerType == type) {
            System.out.println("【客户端】发送的数据 age:" + data.getWorker().getAge() + " 名字：" + data.getWorker().getName());
        } else {
            System.out.println("传输类型错误。。。");
        }

    }

    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        // write + flush 将数据写入缓冲并刷新
        // 发送的数据进行编码
        ctx.writeAndFlush(Unpooled.copiedBuffer("hello,客户端~ 喵1",CharsetUtil.UTF_8));
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        // 发生异常，关闭通道
        ctx.close();
    }
}
